const fs = require('fs');
const path = require('path');

// 需要忽略的文件夹和文件
const IGNORE_PATTERNS = [
    'node_modules',
    '.git',
    '.idea',
    '.vscode',
    'dist',
    'build',
    'downloads',
    'test-results',
    'playwright-report',
    'blob-report',
    'playwright/.cache'
];

// 自动生成目录树的主函数
async function generateDirectoryTree() {
    try {
        function generateTree(startPath) {
            let output = '';

            // 添加根目录
            output += `${path.basename(startPath)}\n`;

            function buildTree(currentPath, prefix = '') {
                const files = fs.readdirSync(currentPath);
                // 过滤掉需要忽略的文件和文件夹
                const filteredFiles = files.filter(file => !IGNORE_PATTERNS.includes(file));

                // 分离文件夹和文件
                const folders = [];
                const normalFiles = [];

                filteredFiles.forEach(file => {
                    const fullPath = path.join(currentPath, file);
                    const stats = fs.statSync(fullPath);
                    if (stats.isDirectory()) {
                        folders.push(file);
                    } else {
                        normalFiles.push(file);
                    }
                });

                // 先处理文件夹
                folders.forEach((folder, index) => {
                    const fullPath = path.join(currentPath, folder);
                    const isLast = index === folders.length - 1 && normalFiles.length === 0;
                    
                    // 确定显示的前缀符号
                    const connector = isLast ? '└── ' : '├── ';
                    const newPrefix = prefix + (isLast ? '    ' : '│   ');

                    // 添加文件夹到输出，使用📁作为文件夹标记
                    output += `${prefix}${connector}📁 ${folder}/\n`;

                    // 递归处理子文件夹
                    buildTree(fullPath, newPrefix);
                });

                // 再处理文件
                normalFiles.forEach((file, index) => {
                    const isLast = index === normalFiles.length - 1;
                    
                    // 确定显示的前缀符号
                    const connector = isLast ? '└── ' : '├── ';
                    const newPrefix = prefix + (isLast ? '    ' : '│   ');

                    // 添加文件到输出
                    output += `${prefix}${connector}📄 ${file}\n`;
                });
            }

            buildTree(startPath, '');
            return output;
        }

        // 获取当前目录
        const currentDir = process.cwd();

        // 生成目录树
        const treeStructure = generateTree(currentDir);

        // 读取现有的 README.md 文件内容
        let existingContent = '';
        if (fs.existsSync('README.md')) {
            existingContent = fs.readFileSync('README.md', 'utf8');
        }

        // 准备新的目录结构内容
        const directoryStructure = `## 项目目录结构

\`\`\`
${treeStructure}
\`\`\`
`;

        // 如果文件已存在，查找并替换目录结构部分
        if (existingContent) {
            // 使用正则表达式匹配目录结构部分
            const directoryPattern = /## 项目目录结构\n\n```[\s\S]*?```/;
            
            if (directoryPattern.test(existingContent)) {
                // 如果找到了目录结构部分，替换它
                const finalContent = existingContent.replace(directoryPattern, directoryStructure);
                fs.writeFileSync('README.md', finalContent);
                console.log('目录结构已成功更新到 README.md 文件中');
            } else {
                // 如果没找到目录结构部分，追加到文件末尾
                fs.writeFileSync('README.md', `${existingContent}\n\n${directoryStructure}`);
                console.log('目录结构已成功追加到 README.md 文件中');
            }
        } else {
            // 如果文件不存在，创建新文件
            fs.writeFileSync('README.md', `# 项目说明\n\n${directoryStructure}`);
            console.log('README.md 文件已成功创建');
        }

        return {
            success: true,
            message: '目录结构生成成功'
        };
    } catch (error) {
        console.error('生成目录结构时发生错误:', error);
        return {
            success: false,
            message: '目录结构生成失败',
            error: error.message
        };
    }
}

// 自动执行
generateDirectoryTree().then(result => {
    if (!result.success) {
        process.exit(1);
    }
});